# OAuth认证控制器
from flask import Blueprint, request, redirect, url_for, session, flash, jsonify
from flask_login import login_user, logout_user, login_required, current_user
from app.services.oauth_service import OAuthService
from app.models.user import User

# 创建蓝图
oauth_bp = Blueprint('oauth', __name__)

@oauth_bp.route('/login/github')
def github_login():
    """GitHub OAuth登录"""
    # 生成状态参数用于CSRF保护
    import secrets
    state = secrets.token_urlsafe(16)
    session['oauth_state'] = state
    
    # 获取GitHub授权URL
    authorize_url = OAuthService.get_github_authorize_url()
    
    # 添加状态参数
    authorize_url = f"{authorize_url}&state={state}"
    
    return redirect(authorize_url)

@oauth_bp.route('/callback/github')
def github_callback():
    """GitHub OAuth回调"""
    # 获取授权码和状态参数
    code = request.args.get('code')
    state = request.args.get('state')
    
    # 验证状态参数
    if state != session.get('oauth_state'):
        flash('OAuth认证失败：状态参数不匹配', 'danger')
        return redirect(url_for('auth.login'))
    
    # 清除会话中的状态参数
    session.pop('oauth_state', None)
    
    if not code:
        flash('OAuth认证失败：未收到授权码', 'danger')
        return redirect(url_for('auth.login'))
    
    # 使用GitHub进行认证
    user, error = OAuthService.authenticate_with_github(code)
    
    if error:
        flash(f'OAuth认证失败：{error}', 'danger')
        return redirect(url_for('auth.login'))
    
    # 登录用户
    login_user(user, remember=True)
    
    # 如果是AJAX请求，返回JSON响应
    if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
        return jsonify({
            'success': True,
            'message': '登录成功',
            'user': user.to_dict()
        })
    
    # 重定向到原始请求的页面或仪表板
    next_page = request.args.get('next')
    if not next_page or not next_page.startswith('/'):
        next_page = url_for('profile.dashboard')
    
    flash(f'欢迎回来，{user.nickname or user.username}！', 'success')
    return redirect(next_page)

@oauth_bp.route('/unlink/github')
@login_required
def unlink_github():
    """解除GitHub账号绑定"""
    # 这里可以添加解除绑定的逻辑
    # 例如，移除GitHub相关的用户信息或标记
    flash('GitHub账号已解除绑定', 'info')
    return redirect(url_for('profile.settings'))